package com.projekt.alpar;

import HatterOsztalyok.Database;
import android.app.ExpandableListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.TextView;

public class PlaylistsActivity extends ExpandableListActivity {
	private MyExpandableListAdapter mAdapter;
	private Intent intent;

	/**
	 * Létrehozza az activity-t
	 */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		mAdapter = new MyExpandableListAdapter();
		setListAdapter(mAdapter);
		// registerForContextMenu(getExpandableListView());
		intent = new Intent("com.projekt.alpar.commandevent");
	}

	/**
	 * Ha a felhasználó kiválaszt egy elemet a listából ez a metódus hívodik
	 * meg. Jelzi a PlayerService-nek, hogy ezt a zenét játssza le
	 */
	public boolean onChildClick(ExpandableListView parent, View v,
			int groupPosition, int childPosition, long id) {
		Log.i("AlbumsActivity", "onchildclick meghivva");
		intent.putExtra("source", 2);
		intent.putExtra("count", childPosition);
		intent.putExtra("filter", mAdapter.getGroupName(groupPosition));
		sendBroadcast(intent);
		return true;
	}

	/**
	 * Adapter osztály, amely az adatokat szolgáltatja az Activity-nek *
	 */
	private class MyExpandableListAdapter extends BaseExpandableListAdapter {
		private String[] groups;
		private String[][] childs;
		private int loaded[];
		private int groupLength;

		/**
		 * Konstruktor, amely lekérdezi az adatokat az adatbázistól
		 */
		public MyExpandableListAdapter() {
			Log.i("MyExpandableListAdapter", "konstruktor meghivva");

			Database adat = new Database(getApplicationContext(),
					getContentResolver(), 1);
			SQLiteDatabase db = adat.getReadableDatabase();

			String oszlopok[] = { "name" };
			Cursor lekerd = db.query("Playlist", oszlopok, null, null, null,
					null, null);
			if (lekerd == null)
				Log.e("MyExpandableListAdapter", "lekerdezes==null");
			else if (!lekerd.moveToFirst())
				Log.e("MyExpandableListAdapter", "no query result");
			else {
				groupLength = 0;
				groups = new String[lekerd.getCount()];
				loaded = new int[lekerd.getCount()];
				childs = new String[lekerd.getCount()][];
				Log.i("MyExpandableListAdapter", "lekerdezes OK");
				do {
					groups[groupLength] = lekerd.getString(lekerd
							.getColumnIndex("name"));
					Log.i("MyExpandableListAdapter", "lekerdezes="
							+ groups[groupLength]);
					loaded[groupLength++] = 0;
				} while (lekerd.moveToNext());
			}
			Log.i("MyExpandableListAdapter", "lekerdezes OK");
			adat.close();
		}

		/**
		 * Visszatéríti az egyes belső elemeket
		 * 
		 * @param groupPosition
		 *            Hányadik csoportba tartozik az elem
		 * @param childPosition
		 *            Hányadik a csoportban
		 */
		public Object getChild(int groupPosition, int childPosition) {
			Log.i("MyExpandableListAdapter",
					"getChild meghivva " + Integer.toString(groupPosition)
							+ " " + Integer.toString(childPosition));
			return childs[groupPosition][childPosition];
		}

		/**
		 * Visszatéríti a belső elem id-ját, amely megegyezik a csoportban
		 * elfoglalt pozíciójával
		 * 
		 * @param groupPosition
		 *            Hányadik csoportba tartozik az elem
		 * @param childPosition
		 *            Hányadik a csoportban
		 */
		public long getChildId(int groupPosition, int childPosition) {
			return childPosition;
		}

		/**
		 * Visszatéríti, hogy a csoportban hány elem van
		 * 
		 * @param groupPosition
		 *            Hányadik csoportba id-ja
		 */
		public int getChildrenCount(int groupPosition) {
			Log.i("MyExpandableListAdapter", "getChildrenCount meghivva "
					+ Integer.toString(groupPosition));
			if (loaded[groupPosition] == 0)
				loadGroup(groupPosition);
			return loaded[groupPosition];
		}

		/**
		 * Visszatéríti az általános View-t egy elemnek
		 */
		public TextView getGenericView() {
			AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
					ViewGroup.LayoutParams.MATCH_PARENT, 64);

			TextView textView = new TextView(PlaylistsActivity.this);
			textView.setLayoutParams(lp);
			textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
			textView.setPadding(36, 0, 0, 0);
			return textView;
		}

		/**
		 * Visszatéríti a view-t egy adott elemről, ami egy TextView-ből áll
		 * 
		 * @param groupPosition
		 *            Hányadik csoportba tartozik az elem
		 * @param childPosition
		 *            Hányadik a csoportban
		 */
		public View getChildView(int groupPosition, int childPosition,
				boolean isLastChild, View convertView, ViewGroup parent) {
			TextView textView = getGenericView();
			textView.setText(getChild(groupPosition, childPosition).toString());
			return textView;
		}

		/**
		 * Visszatéríti egy adott csoport információit(ebben az esetben a nevét)
		 */
		public Object getGroup(int groupPosition) {
			return groups[groupPosition];
		}

		/**
		 * Visszatéríti a csoportok számát
		 */
		public int getGroupCount() {
			return groupLength;
		}

		/**
		 * Visszatéríti a csoport id-ját, ami ebben az esetben megegyezik a
		 * pozíciójával
		 */
		public long getGroupId(int groupPosition) {
			return groupPosition;
		}

		/**
		 * Visszatéríti a view-t egy csoporthoz
		 */
		public View getGroupView(int groupPosition, boolean isExpanded,
				View convertView, ViewGroup parent) {
			TextView textView = getGenericView();
			textView.setText(getGroup(groupPosition).toString());
			return textView;
		}

		/**
		 * Visszatéríti, hogy az illető belső elem választható-e
		 */
		public boolean isChildSelectable(int groupPosition, int childPosition) {
			return true;
		}

		/**
		 * Visszatéríti, hogy az id-k stabilak-e az adatok változása esetén
		 */
		public boolean hasStableIds() {
			return true;
		}

		/**
		 * Ha egy olyan csoport volt kiválasztva, ami még nincs betöltve az
		 * adatbázisból, akkor betölti
		 * 
		 * @param groupPosition
		 *            Hányadik csoport
		 */
		private void loadGroup(int groupPosition) {
			Log.i("MyExpandableListAdapter",
					"loadgroup meghivva " + Integer.toString(groupPosition));

			Database adat = new Database(getApplicationContext(),
					getContentResolver(), 1);
			SQLiteDatabase db = adat.getReadableDatabase();

			Log.i("MyExpandableListAdapter", "lekerdezes elott lista neve="
					+ groups[groupPosition]);
			Cursor lekerd = db
					.rawQuery(
							"SELECT Music.title FROM Music, Playlist, Conn WHERE Conn.mid=Music.id AND Conn.pid=Playlist.id AND Playlist.name='"
									+ groups[groupPosition] + "'", null);
			if (lekerd == null)
				Log.e("MyExpandableListAdapter", "Grouplekerdezes==null");
			else if (!lekerd.moveToFirst())
				Log.e("MyExpandableListAdapter", "Group: no query result");
			else {
				Log.i("PlaylistsActivity",
						"Zenek szama=" + Integer.toString(lekerd.getCount()));
				loaded[groupPosition] = lekerd.getCount();
				childs[groupPosition] = new String[loaded[groupPosition]];
				int k = 0;
				do {
					childs[groupPosition][k++] = lekerd.getString(lekerd
							.getColumnIndex("title"));
				} while (lekerd.moveToNext());
			}
			adat.close();
		}

		/**
		 * Visszatéríti a csoport nevét
		 * 
		 * @param groupPosition
		 *            Hányadik csoport
		 */
		public String getGroupName(int groupPosition) {
			return groups[groupPosition];
		}
	}
}